home *** CD-ROM | disk | FTP | other *** search
/ GameStar 2006 February / Gamestar_81_2006-02_dvd.iso / Red Shark / Common / UnitStateControl.script < prev    next >
Text File  |  2001-11-08  |  6KB  |  294 lines

  1. //-------------------------------------------------------------------
  2. //
  3. //  This code is copyright 2001 by G5 Software.
  4. //  Any unauthorized usage, either in part or in whole of this code
  5. //  is strictly prohibited. Violators WILL be prosecuted to the
  6. //  maximum extent allowed by law.
  7. //
  8. //-------------------------------------------------------------------
  9.  
  10. class CInteriorMeshObjectPrefix
  11. {
  12.   string GetInteriorMeshObjectId()
  13.   {
  14.     return ConvertIdToInteriorId(Core_GetIdentificator());
  15.   }
  16.  
  17.   string GetMeshSourceObjectId()
  18.   {
  19.     string ObjectId = Core_GetIdentificator();
  20.     return Core_GetSubString(ObjectId, 1, Core_GetStringLength(ObjectId) - 2);
  21.   }
  22.  
  23.   bool IsInteriorObjectId(
  24.       string _Id
  25.     )
  26.   {
  27.     return Core_IsStringStartsWith(_Id, "{");
  28.   }
  29.  
  30.   string ConvertIdToInteriorId(
  31.       string _Id
  32.     )
  33.   {
  34.     return "{" + _Id + "}";
  35.   }
  36. }
  37.  
  38.  
  39.  
  40. class CExplosionGenerator
  41. {
  42.   void GenerateBullets(
  43.       int    _BulletsQty,
  44.       string _BulletType,
  45.       array  _AngleRange,
  46.       float  _Distance,
  47.       array  _TimeRange,
  48.       array  _SpeedRange,
  49.       matrix _Position
  50.     )
  51.   {
  52.     for (int Bullet = 0; Bullet < _BulletsQty; Bullet = Bullet + 1)
  53.     {
  54.       float Alpha = rand(Math_PI);
  55.       float Beta  = rand(_AngleRange[0], _AngleRange[1]);
  56.  
  57.       vector RandomDirection = _Position * vector(
  58.           sin(Alpha) * cos(Beta),
  59.           cos(Alpha) * cos(Beta),
  60.           sin(Beta)
  61.         );
  62.  
  63.       Core_ScheduleTask(
  64.           "Bullets",
  65.           OT_CallFunction,
  66.           rand(_TimeRange[0], _TimeRange[1]),
  67.           "CreateBullet",
  68.           _BulletType,
  69.           Core_SetMatrixOrigin(_Position,
  70.             Core_GetMatrixOrigin(_Position) + RandomDirection * _Distance),
  71.           RandomDirection * rand(_SpeedRange[0], _SpeedRange[1])
  72.         );
  73.     }
  74.   }
  75. }
  76.  
  77.  
  78.  
  79. class CUnitLifeControl
  80.   extends CInteriorMeshObjectPrefix, CExplosionGenerator
  81. {
  82.   float  m_DeathPower   = 50.0;
  83.   float  m_MaxHitpoints = 1.0;
  84.   float  m_NowHitpoints = 1.0;
  85.   string m_ExplosionId  = "";
  86.   float  m_DestroyPause = 0.0;
  87.   bool   m_SplashOnHit  = true;
  88.   bool   m_ImmortalMode = false;
  89.  
  90.   void CUnitLifeControl(
  91.       float  _InitialHP
  92.     )
  93.   {
  94.     m_MaxHitpoints = _InitialHP;
  95.     m_NowHitpoints = _InitialHP;
  96.  
  97.     SetSpeedThreshold(2.0f);
  98.   }
  99.  
  100.   void OnObjectLoaded()
  101.   {
  102.     HitpointsWasChanged(m_NowHitpoints);
  103.   }
  104.  
  105.   void OnToDamage(
  106.       float  _DamageRate,   // damage applied to object
  107.       string _TargetId,     // target object id, "" if none
  108.       string _SourceType,   // source type (explosion type)
  109.       matrix _SourcePlace   // source place
  110.     )
  111.   {
  112.     if (m_ImmortalMode)
  113.       return;
  114.  
  115.     m_NowHitpoints = m_NowHitpoints - _DamageRate;
  116.  
  117.     if (m_NowHitpoints <= 0.0)
  118.     {
  119.       m_NowHitpoints = 0.0;
  120.       DetonateObject();
  121.     }
  122.  
  123.     HitpointsWasChanged(m_NowHitpoints);
  124.  
  125.     if (_SourceType == "DotExplosion")
  126.     {
  127.       if (m_SplashOnHit)
  128.       {
  129.         GenerateBullets(
  130.             30,
  131.             "BULLETID_BulletHitSplashItem",
  132.             array(Math_HALFPI * 0.5, Math_HALFPI),
  133.             0,
  134.             array(0.0, 0.3),
  135.             array(10.0, 15.0),
  136.             _SourcePlace
  137.           );
  138.       }
  139.  
  140.       Core_CallFunction(
  141.           "Effects",
  142.           "CreateEffect",
  143.           "EFFECTID_BulletHitObjectEffect",
  144.           _SourcePlace
  145.         );
  146.       Core_CallFunction(
  147.           "Sounds",
  148.           "CreateSound",
  149.           "SOUNDID_BulletHitObjectSound",
  150.           _SourcePlace
  151.         );
  152.     }
  153.   }
  154.  
  155.   void HitpointsWasChanged(
  156.       float _NowHitpoints
  157.     )
  158.   {
  159.   }
  160.  
  161.   void CreateDetonateEffects()
  162.   {
  163.   }
  164.  
  165.   bool m_IsExploded = false;
  166.  
  167.   void DetonateObject()
  168.   {
  169.     if (m_IsExploded)
  170.       return;
  171.     m_IsExploded = true;
  172.  
  173.     if ("" != m_ExplosionId)
  174.     {
  175.       Core_CallFunction(
  176.           "Explosions",
  177.           "CreateExplosion",
  178.           m_ExplosionId,
  179.           GetUnitPosition()
  180.         );
  181.     }
  182.  
  183.     CreateDetonateEffects();
  184.     DestroyComponent();
  185.   }
  186.  
  187.   void DestroyComponent()
  188.   {
  189.     // Create interior object
  190.     if (0.0 < m_DestroyPause)
  191.     {
  192.       Core_CallFunction(
  193.           SOID_MissionController,
  194.           "CreateComponent",
  195.           GetInteriorMeshObjectId(),
  196.           "InteriorObject",
  197.           "CInteriorMeshObject"
  198.         );
  199.       Core_ScheduleTask(
  200.           SOID_MissionController,
  201.           OT_CallFunction,
  202.           m_DestroyPause,
  203.           "DestroyGameObject",
  204.           GetInteriorMeshObjectId()
  205.         );
  206.     }
  207.  
  208.     // Destroy object
  209.     Core_PostEventTo(
  210.         SOID_MissionController,
  211.         "DestroyGameObject",
  212.         Core_GetIdentificator()
  213.       );
  214.   }
  215.  
  216.   void OnCollisionOccured(
  217.       float _fPower
  218.     )
  219.   {
  220.     OnToDamage(
  221.         m_MaxHitpoints * _fPower / m_DeathPower,
  222.         Core_GetIdentificator(),
  223.         "Collision",
  224.         GetUnitPosition()
  225.       );
  226.   }
  227.  
  228.   void OnUnitStartsMovement()
  229.   {
  230.   }
  231.  
  232.   void OnUnitStopMovement()
  233.   {
  234.   }
  235. }
  236.  
  237.  
  238. class CInteriorMeshObject extends CInteriorMeshObjectPrefix
  239. {
  240.   void CInteriorMeshObject()
  241.   {
  242.     TakeComponentOwnership("Mesh", GetMeshSourceObjectId(), "Mesh");
  243.     SetCompoundObjectPositionable("Mesh");
  244.  
  245.     Core_RemoveClassificator("Russian");
  246.     Core_RemoveClassificator("German");
  247.     Core_AddClassificator(CLASSIFICATOR_NOTVISIBLEONRADAR);
  248.   }
  249. }
  250.  
  251.  
  252. class CMobileGroundUnitStateControl extends CUnitLifeControl
  253. {
  254.   void CMobileGroundUnitStateControl(
  255.       float _InitialHP
  256.     )
  257.   {
  258.     CUnitLifeControl(_InitialHP);
  259.     SetSpeedThreshold(2.0f);
  260.   }
  261.  
  262.   void OnUnitStartsMovement()
  263.   {
  264.     Core_SendEventTo(Core_GetIdentificator(), "PlayEngineSound");
  265.     Core_SendEventTo(Core_GetIdentificator(), "StartDustGeneration");
  266.   }
  267.  
  268.   void OnUnitStopMovement()
  269.   {
  270.     Core_SendEventTo(Core_GetIdentificator(), "StopEngineSound");
  271.     Core_SendEventTo(Core_GetIdentificator(), "StopDustGeneration");
  272.   }
  273. }
  274.  
  275.  
  276. class CGroundUnitDustGenerator
  277. {
  278.   string DustItemEffect = "EFFECTID_DustEffect";
  279.   float  ItemsPerSecond = 7.5;
  280.  
  281.   void StartDustGeneration()
  282.   {
  283.     EnableDustGeneration();
  284.   }
  285.  
  286.   void StopDustGeneration()
  287.   {
  288.     DisableDustGeneration();
  289.   }
  290. }
  291.  
  292.  
  293.  
  294.